package main

import (
	"context"
	"fmt"

	"go.uber.org/fx"
)

// 全局变量
var globalVar int

var globalVar2 int

func init() {
	// 初始化全局变量
	globalVar = 10
	fmt.Println("init() 函数执行，全局变量已初始化")
}

func Setup(value int) {
	// 初始化全局变量
	globalVar2 = value
	fmt.Println("Setup() 函数执行，全局变量2已初始化")
}

type App struct {
	Config string
}

func NewApp() *App {
	app := &App{}
	// 调用 Setup 函数进行初始化
	app.Setup()
	return app
}

func NewApp2() *App {
	return &App{}
}

func (a *App) Setup() {
	fmt.Println("App 的 Setup 函数执行，进行初始化操作")
	a.Config = "default config"
}

func main() {
	fmt.Println("main() 函数执行，全局变量的值[globalVar]为:", globalVar)
	fmt.Println("main() 函数执行，全局变量的值[globalVar2]为:", globalVar2)

	// 调用 Setup() 函数
	Setup(20)

	fmt.Println("main() 函数执行，全局变量的值[globalVar2]为:", globalVar2)

	app := NewApp()
	fmt.Printf("App 的配置: %s\n", app.Config)
	// 其他业务逻辑

	app2 := fx.New(
		fx.Provide(NewApp2),
		fx.Invoke(func(app *App) {
			app.Setup()
			fmt.Println("完成初始化，准备退出")
		}),
	)
	//app2.Run()

	app2.Start(context.Background()) // 启动应用
	app2.Stop(context.Background())  // 手动停止应用
	/*
	   [Fx] PROVIDE    fx.Lifecycle <= go.uber.org/fx.New.func1()
	   [Fx] PROVIDE    fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
	   [Fx] PROVIDE    fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
	   [Fx] PROVIDE    *main.App <= main.NewApp2()
	   [Fx] INVOKE             main.main.func1()
	   [Fx] RUN        provide: main.NewApp2() in 0s
	   App 的 Setup 函数执行，进行初始化操作
	   完成初始化，准备退出
	   [Fx] RUNNING
	*/
	// 其他业务逻辑
}
